// 环境互斥激活系统测试文件
// 用于验证开发、测试、预发布、正式环境只能同时激活一个

// 模拟环境数据
const mockEnvironments = [
  { id: 'dev-1', name: '开发环境1', type: 'development' },
  { id: 'test-1', name: '测试环境1', type: 'test' },
  { id: 'preview-1', name: '预发布环境1', type: 'preview' },
  { id: 'prod-1', name: '正式环境1', type: 'production' },
  { id: 'custom-1', name: '自定义环境1', type: 'custom' },
];

// 模拟存储管理器
class MockStorageManager {
  constructor() {
    this.activeEnvironments = [];
    this.activeEnvironmentType = null;
  }

  addActiveEnvironments(id, envType) {
    // 清除之前的所有活跃环境
    this.clearAllActiveEnvironments();
    
    // 添加新的活跃环境
    this.activeEnvironments = [id];
    this.activeEnvironmentType = envType;
    
    console.log(`✅ 激活环境: ${id} (${envType})`);
    console.log(`📊 当前活跃环境: ${JSON.stringify(this.activeEnvironments)}`);
    console.log(`🏷️ 当前活跃环境类型: ${this.activeEnvironmentType}`);
  }

  addActiveEnvironmentsWithInfo(id, envType, allEnvironments) {
    if (envType === 'custom') {
      // 自定义环境：直接添加到活跃列表，不受互斥限制
      if (!this.activeEnvironments.includes(id)) {
        this.activeEnvironments.push(id);
      }
      console.log(`✅ 激活自定义环境: ${id} (与标准环境共存)`);
    } else {
      // 标准环境：清除其他标准环境，保留自定义环境
      const standardTypes = ['development', 'test', 'preview', 'production'];
      
      // 找出当前活跃的自定义环境
      const customEnvs = this.activeEnvironments.filter(activeId => {
        const env = allEnvironments.find(e => e.id === activeId);
        return env && env.type === 'custom';
      });
      
      // 清除所有环境，然后添加新的标准环境 + 保留的自定义环境
      this.activeEnvironments = [id];
      
      // 再添加之前保留的自定义环境
      customEnvs.forEach(envId => {
        if (envId !== id) {
          this.activeEnvironments.push(envId);
        }
      });
      
      this.activeEnvironmentType = envType;
      console.log(`✅ 激活标准环境: ${id} (${envType})`);
      if (customEnvs.length > 0) {
        console.log(`🔄 保留自定义环境: ${JSON.stringify(customEnvs)}`);
      }
    }
    
    console.log(`📊 当前活跃环境: ${JSON.stringify(this.activeEnvironments)}`);
    console.log(`🏷️ 当前活跃环境类型: ${this.activeEnvironmentType}`);
  }

  deleteActiveEnvironments(id) {
    const index = this.activeEnvironments.indexOf(id);
    if (index > -1) {
      this.activeEnvironments.splice(index, 1);
      if (this.activeEnvironments.length === 0) {
        this.activeEnvironmentType = null;
      }
      console.log(`❌ 取消激活环境: ${id}`);
    }
  }

  getActiveEnvironments() {
    return [...this.activeEnvironments];
  }

  getActiveEnvironmentType() {
    return this.activeEnvironmentType;
  }

  clearAllActiveEnvironments() {
    this.activeEnvironments = [];
    this.activeEnvironmentType = null;
    console.log(`🧹 清除所有活跃环境`);
  }
}

// 测试函数
function testEnvironmentMutex() {
  console.log('🚀 开始测试环境智能互斥激活系统...\n');
  
  const storage = new MockStorageManager();
  
  // 模拟环境数据
  const allEnvironments = [
    { id: 'dev-1', type: 'development' },
    { id: 'test-1', type: 'test' },
    { id: 'preview-1', type: 'preview' },
    { id: 'prod-1', type: 'production' },
    { id: 'custom-1', type: 'custom' },
    { id: 'custom-2', type: 'custom' },
  ];
  
  // 测试1: 激活开发环境
  console.log('📋 测试1: 激活开发环境');
  storage.addActiveEnvironmentsWithInfo('dev-1', 'development', allEnvironments);
  
  // 测试2: 激活自定义环境1（应该与开发环境共存）
  console.log('\n📋 测试2: 激活自定义环境1（与标准环境共存）');
  storage.addActiveEnvironmentsWithInfo('custom-1', 'custom', allEnvironments);
  
  // 测试3: 激活自定义环境2（应该与开发环境和自定义环境1共存）
  console.log('\n📋 测试3: 激活自定义环境2（多自定义环境共存）');
  storage.addActiveEnvironmentsWithInfo('custom-2', 'custom', allEnvironments);
  
  // 测试4: 激活测试环境（应该自动取消开发环境，但保留自定义环境）
  console.log('\n📋 测试4: 激活测试环境（保留自定义环境）');
  storage.addActiveEnvironmentsWithInfo('test-1', 'test', allEnvironments);
  
  // 测试5: 激活预发布环境（应该自动取消测试环境，但保留自定义环境）
  console.log('\n📋 测试5: 激活预发布环境（保留自定义环境）');
  storage.addActiveEnvironmentsWithInfo('preview-1', 'preview', allEnvironments);
  
  // 测试6: 激活正式环境（应该自动取消预发布环境，但保留自定义环境）
  console.log('\n📋 测试6: 激活正式环境（保留自定义环境）');
  storage.addActiveEnvironmentsWithInfo('prod-1', 'production', allEnvironments);
  
  // 测试7: 再次激活开发环境（应该自动取消正式环境，但保留自定义环境）
  console.log('\n📋 测试7: 再次激活开发环境（保留自定义环境）');
  storage.addActiveEnvironmentsWithInfo('dev-1', 'development', allEnvironments);
  
  // 测试8: 取消激活开发环境
  console.log('\n📋 测试8: 取消激活开发环境');
  storage.deleteActiveEnvironments('dev-1');
  
  // 测试9: 取消激活自定义环境1
  console.log('\n📋 测试9: 取消激活自定义环境1');
  storage.deleteActiveEnvironments('custom-1');
  
  console.log('\n🎉 测试完成！');
  console.log('📊 最终状态:');
  console.log(`   活跃环境: ${JSON.stringify(storage.getActiveEnvironments())}`);
  console.log(`   活跃环境类型: ${storage.getActiveEnvironmentType()}`);
}

// 运行测试
if (typeof window !== 'undefined') {
  // 浏览器环境
  window.testEnvironmentMutex = testEnvironmentMutex;
  console.log('🌐 在浏览器控制台中运行: testEnvironmentMutex()');
} else {
  // Node.js环境
  testEnvironmentMutex();
}
